package excercise;

public class EX03_OOP2 {

	public static void main(String[] args) {									
	// 문제 1
	RetangleValue r = new RetangleValue( 35, 45, "silver" );
	float area = RetangleService.getArea( 4, 56 );
	System.out.println( area );
	float perimeter = RetangleService.getPerimeter( 6, 7 );
	System.out.println( perimeter );

	// 문제 2
	// FanValue fvo = new FanValue( new FanValue().FAST  , "yellow", 3, true );   // 객체생성후 만드는법 편법임 올바른거 아님
	FanValue fvo = new FanValue( FanValue.FAST, "yellow", 3, true );
	System.out.print( "선풍기 현재상태 : ");
	// FanService.showFanInfo ( f.speed, f.on, f.radius, f.color
	FanService.toString( fvo );
	
	// 문제 3
	AccountValue av = new AccountValue( 1122, 20000, 4.5F, "수쳔년 쥐나 마침내 선택받은~" );
	
	System.out.println( AccountService.getMonthlyInterestRate( av ) );				// 월간이자율 계산
	AccountService.withDraw( 5450, av.balance );
	System.out.println( av.balance );
	// call by value (값에 의해 전달)
	// 메서드의 매개변수 유형이 기본 자료형인 경우
	// 기본자료형 값을 메서드의 매개변수로 전달하면
	// JVM은 메서드의 지역변수에 그 값을 복사해 줌
	// 따라서, 메서드의 지역변수의 값을 변경하더라도, 
	// 전달해준 변수에는 영향을 미치지는 않음
	
	AccountService.withDraw( av, 5450 );														// 예금출금
	System.out.println( av.balance );
	// call by value (주소에 의해 전달)
	// 메서드의 매개변수 유형이 참조 자료형인 경우
	// 만일, 참조형 변수를 메서드의 ㅂ매개변수로 전달하면
	// 지역변수는 참조형 변수가 전달해준 객체를 가리키게 됨
	// 즉, 참조형 변수에 저장된 값은 실제 값이 아니고 
	// 그 값을 가르키는 주소를 의미하기 때문임
	// 따라서, 메서드에서 참조된 객체에 변경을 가하면
	// 그 변화는 호출된 코드에도 반영됨
	
	
	// 문제 4
		
	
	
	
	// getset 문제 1-1
	RetangleVO2 rv2 = new RetangleVO2( 4, 40, "red" );
	
	// 문제 1-1 정답 출력
	System.out.println("");
	System.out.println( "문 1-1 사각형 정보");
	System.out.println( "가로 : " + rv2.getWidth() );
	System.out.println( "세로 : " + rv2.getHeight() );
	System.out.println( "색깔 : " + rv2.getColor() );
	System.out.println( "문 1-1 사각형 넓이 : " + RetangleService2.getArea( rv2 ) );
	System.out.println( "문 1-1 사각형 둘레 : " + RetangleService2.getPerimeter( rv2 ) );
	
	// getset 문제 1-2
	RetangleVO2 rv3 = new RetangleVO2( 3.5F, 35.9F, "orange" );
		
	// 문제 1-2 정답 출력
	System.out.println("");
	System.out.println( "문 1-2 사각형 정보");
	System.out.println( "가로 : " + rv3.getWidth() );
	System.out.println( "세로 : " + rv3.getHeight() );
	System.out.println( "색깔 : " + rv3.getColor() );
	System.out.println( "문 1-2 사각형 넓이 : " + RetangleService2.getArea( rv3 ) );
	System.out.println( "문 1-2 사각형 둘레 : " + RetangleService2.getPerimeter( rv3 ) );
		
	
	// 문 2-1 
	FanVO2 fvo2 = new FanVO2(10, "yellow", FanVO2.SLOW, true );
	System.out.println( "" );
	System.out.println("문2-1 선풍기 상태는?");
	FanService2.toString( fvo2 );
	
	// 문 2-2
	FanVO2 fvo3 = new FanVO2(5, "blue", FanVO2.MEDIUM, false );
	System.out.println( "" );
	System.out.println("문2-2 선풍기 상태는");
	FanService2.toString( fvo3 );
	
	
	// 문3-1 
	System.out.println( "" );
	System.out.println( "문 3-1" );
	AccountVO2 avo2 = new AccountVO2(1122, 20000, 4.5F, "12월 12일");
	System.out.println( "현재 예금액 : " + avo2.getBalance() );
	AccountService2.withDraw(avo2, 5000);
	System.out.println( "인출 후 금액 : " + avo2.getBalance() );
	System.out.println( "잔액 : " + avo2.getBalance() );
	System.out.println( "월간 이자율 : " + AccountService2.getMonthlyInterestRate( avo2 ) );
	System.out.println( "통장 개설일 : " + avo2.getDateCreated() );
	
	// 문3-1 
	System.out.println( "" );
	System.out.println( "문 3-2" );
	AccountVO2 avo3 = new AccountVO2(1122, 20000, 4.5F, "12월 12일");
	System.out.println( "현재 예금액 : " + avo3.getBalance() );
	AccountService2.deposit(avo3, 10000);
	System.out.println( "입금 후 금액 : " + avo3.getBalance() );
	System.out.println( "잔액 : " + avo3.getBalance() );
	System.out.println( "월간 이자율 : " + AccountService2.getMonthlyInterestRate( avo2 ) );
	System.out.println( "통장 개설일 : " + avo2.getDateCreated() );
	
	// 문 4-1
	System.out.println("");
	System.out.println( "문 4-1" );
	StockVO2 ato2 = new StockVO2( "경영기술", 1_000_000, 750_000);
	System.out.println( "종목명 : " + ato2.getSname() );
	System.out.println( "종가 : " + ato2.getPreviousClosingPrice() );
	System.out.println( "시가 : " + ato2.getCurrentPrice() );
	System.out.println( "변동률 : " + StockService2.getChangePercent( ato2 ) );
	
	} // main
	
} // class


// 문1 - 사각형 Retangle class
class RetangleValue {
	float width = 1.0F; 
	float height = 1.0F;
	String color = "white";	
	
	// 사각형 생성자
	public RetangleValue() { }
	public RetangleValue( float width, float height, String color){
		this.width = width;
		this.height = height;
		this.color = color;
	}
	
} // RetangleValue

class RetangleService {
	
	// 면적계산
	static float getArea( float width, float height ){
		return width * height;
	}
	// 둘레계산
	static float getPerimeter( float width, float height) {
		return ( width * 2 ) + ( height * 2 );
	}
	
} // RectangleService


// 문2 - 선풍기 Fan class
class FanValue {
	// 속도를 나타내는 상수들은
	// 객체 생성없이 바로 사용가능해야 함
	// 따라서, static final 예약어를 사용함
	// 한편, JDK5 이상에서는 이것을 대체하기 위해
	// Enum 이라는 새로운 클래스 자료형이 추가됨
	static final int SLOW = 1;
	static final int MEDIUM = 2;
	static final int FAST = 3;
	int speed;
	boolean on;
	float radius;
	String color;
	
	// 생성자
	public FanValue() {
		speed = SLOW;
		on = false;
		radius = 5.0F;
		color = "blue";
		
	}	
	public FanValue( int radius, String color, int speed, boolean on ){
		 this.radius = radius;
		 this.color = color;
		 this.speed = speed;
		 this.on = on;
	}
	
} // FanValue

class FanService {
	// 정보 출력
	// 메서드 다중정의overloading
	// 메서드 서명만 다르면
	// 메서드 이름은 동일하게 작성가능
	static void showFanInfo( int speed, boolean on, float radius, String color ){}
	
	static void toString( FanValue fv ) {
		if ( fv.on ){  // 참인지 아닌지 안써도됨 on == true
		System.out.println( fv.speed + ", " + fv.color + ", " + fv.radius + " 동작중" );
		}
		else {
		System.out.println( fv.color + ", " + fv.radius + "꺼져있음");
		}
	}	
} // FanService


// 문3 - 은행계좌
class AccountValue{
	int aid;
	int balance;
	float interestRate;
	String dateCreated;
	
	// 생성자
	public AccountValue() { 
		this.aid= 0;
		this.balance = 0;
		this.interestRate = 0;		
	}
	public AccountValue( int aid, int balance, float interestRate, String dateCreated ) {
		this.aid = aid;
		this.balance = balance;
		this.interestRate = interestRate;
		this.dateCreated = dateCreated;
	}
		
} // AccountValue

class AccountService {
	
	static float getMonthlyInterestRate( AccountValue acv ){
		return acv.interestRate / 12; 
	}
	

	
	static int withDraw( int gold, int balance ){
		balance -= gold;
		System.out.println( "인출후 잔액 : " + balance );
		return balance;
	}
	
	// 내가쓴식
	static int withDraw( AccountValue acv, int gold ){
		acv.balance -= gold;
		System.out.println( "인출후 잔액 : " + acv.balance );
		return acv.balance;
	}
	
	
	static int deposit( AccountValue acv, int gold ){
		acv.balance += gold;
		System.out.println( acv.balance );
		return acv.balance;
	}

	
	
} // AccountService

// 문4 주식은 망함 ㅠㅠ
class StockValue {
	String sname;
	int previousClosingPrice;
	int currentPrice;
	
	// 생성자
	public StockValue() { }	
	public StockValue( String sname, int previousClosingPrice, int currentPrice ){
		this.sname = sname;
		this.previousClosingPrice = previousClosingPrice;
		this.currentPrice = currentPrice;
	}
	
	
} // StockValue

class StockService{
	
	static float getChangePercent ( StockValue stv ){ 
		return ( 1 - ( (float)stv.currentPrice / stv.previousClosingPrice) ) * 100 ; 
	}
	
} //StockService

class RetangleVO2 {
	//맴버 변수
	private float width;
	private float height;
	private String color;
		
	//생성자
	public RetangleVO2() {
		this.width = 1.0F;
		this.height = 1.0F;
		this.color = "white";		
	}
	public RetangleVO2( float width, float height, String color ) { 
		this.width = width;
		this.height = height;
		this.color = color;
	}
	
	
	// width GS
	public void setWidth ( float width ){ this.width = width; }
	public float getWidth(){ return this.width; }
	
	// height GS
	public void setHeight ( float height ) { this.height = height;}
	public float getHeight(){ return this.height; }
	
	// color GS
	public void setColor ( String color ){ this.color = color; }
	public String getColor(){ return this.color; }
	
} // RetangleVO2

class RetangleService2{
	
	// 면적 계산
	static float getArea( RetangleVO2 rv2 ) {
		return rv2.getHeight() * rv2.getWidth();
	} // getArea
	
	// 둘레 계산
	static float getPerimeter( RetangleVO2 rv2 ) {
		return ( rv2.getHeight() * 2 ) + ( rv2.getWidth() * 2 );
	} // getPerimeter
		
	
}// RetangleService2

class FanVO2{
	static final int SLOW = 1;
	static final int MEDIUM =2 ;
	static final int FAST = 3;
	private int speed;
	private boolean on;
	private float radius;
	private String color;
	
	// 생성자
	public FanVO2() {
		this.speed = FAST;
		this.on = false;
		this.radius = 5.0F;
		this.color = "blue";
	}
	public FanVO2 ( float radius, String color, int speed, boolean on ){
		this.radius = radius;
		this.color = color;
		this.speed = speed;
		this.on = on;
	}
	
	// speed SG
	public void setSpeed( int speed ) { this.speed = speed; }
	public int getSpeed() { return this.speed; }
	
	// on SG
	public void setOn ( boolean on ){ this.on = on; }
	public boolean getOn ( ) { return this.on; }
	
	// radius SG
	public void setRadius ( float radius ) { this.radius = radius; }
	public float getRadius() { return this.radius; }
	
	// color SG
	public void setColor ( String color ) { this.color = color; }
	public String getColor () { return this.color; }
	
		
} // FanVO2

class FanService2{
	
	// 선풍기 모든 정보 출력
	static void toString ( FanVO2 fvo2 ){
		if ( fvo2.getOn() ){
			System.out.println( "속도 : " + fvo2.getSpeed() );
			System.out.println( "색깔 : " + fvo2.getColor() );
			System.out.println( "크기 : " + fvo2.getRadius() );
			System.out.println( "위이이잉~ 동작중" );
		}
		else {
			System.out.println( "색깔 : " + fvo2.getColor() );
			System.out.println( "크기 : " + fvo2.getRadius() );
			System.out.println( "정지중. 열받게 하지말아요" );
		}
	} // toString

} // FanService2

class AccountVO2{
	private int aid;
	private int balance;
	private float interestRate;
	private String dateCreated;	
	
	// 생성자
	public AccountVO2() {
		this.aid = 0;
		this.balance = 0;
		this.interestRate = 0;
	}
	public AccountVO2( int aid, int balance, float interestRate, String dateCreated ) {
		this.aid = aid;
		this.balance = balance;
		this.interestRate = interestRate;
		this.dateCreated = dateCreated;
	}
	
	// aid SG
	public void setAid ( int aid ) { this.aid = aid; }
	public int getAid ( ) { return this.aid; }
	
	// balance SG
	public int setBalance( int balance ) { return this.balance = balance; }
	public int getBalance ( ) { return this.balance; }
	
	// interestRate SG
	public void setInterestRate( float interestRate ) { this.interestRate = interestRate; }
	public float getInterestRate () { return this.interestRate; }
	
	// dateCreated SG
	public void setDateCreated ( String dateCreated ) { this.dateCreated = dateCreated; }
	public String getDateCreated () { return this.dateCreated; }
	
} // AccountVO2

class AccountService2 {

	// 월간 이자율 계산
	static float getMonthlyInterestRate ( AccountVO2 avo2 ) {
		return avo2.getInterestRate() / 12;
	} // getMonthlyInterestRate
	
	// 예금 인출
	static int withDraw ( AccountVO2 avo2, int gold ) {
		int tmp = avo2.getBalance();
		tmp -= gold;
		System.out.println( "통장잔액 : " + tmp );
		return avo2.setBalance( tmp );
	}
	
	// 예금 입금
	static int deposit ( AccountVO2 avo2, int gold ) {
		int tmp = avo2.getBalance();
		tmp += gold;
		System.out.println( "통장잔액 : " + tmp );
		return avo2.setBalance( tmp );
	}
	
	
	
} // AccountService2

class StockVO2 {
	private String sname;
	private int previousClosingPrice;
	private int currentPrice;
	
	// 생성자
	public StockVO2() { }
	public StockVO2( String sname, int previousClosingPrice, int currentPrice ) {
		this.sname = sname;
		this.previousClosingPrice = previousClosingPrice;
		this.currentPrice = currentPrice;
	}
	
	// sname SG
	public void setSname ( String sname ) { this.sname = sname; }
	public String getSname () { return this.sname; }
	
	// previousClosingPrice SG
	public void setPreviousClosingPrice ( int previousClosingPrice ) { this.previousClosingPrice = previousClosingPrice; }
	public int getPreviousClosingPrice () { return this.previousClosingPrice; }
	
	// currentPrice SG
	public void setCurrentPrice ( int currentPrice ) { this.currentPrice = currentPrice; }
	public int getCurrentPrice () { return this.currentPrice; }
	
} // StockVO2

class StockService2{
	
	// 주가 변동율 계산
	static float getChangePercent ( StockVO2 sto2 ){
		return 1 - ( ( float )  sto2.getPreviousClosingPrice() / sto2.getCurrentPrice() ) * 100;
	} // getChangePercent
	
} // StockService2


